package com.tianbao54.kotlin_01

// object declaration , 对象声明.

object MyObject {

    fun method () {
        println("method")
    }
}

fun main(args: Array<String>) {

    MyObject.method()
    println("-------------")
    MyTest.MyObject.method()
    println("-------------")
    // 类似静态方法， kotlin 中没有静态方法
    println(MyTest.a)
    MyTest.method()
    var v = MyTest.MyObject
    // 获取到 java 中的类型。
    println(v.javaClass)
}

// companion object , 拌生对象
// 在 kotlin 中 与 java 不同的是类没有 static 方法。
// 在大多数情况下， kotlin 推荐的做法是使用包级别的函数来作为静态方法
// kotlin 会将包级别的函数来作为静态方法来看待

class MyTest {

    /**
     * 伴生对象名字可以省略
     * 如果没有提价伴生对象名字，那么编译器会提供默认名字，默认名是 Companion
     * 虽然伴生对象成员看起来像是 java 中的静态成员，但运行期间，他依旧是真实对象的实例成员
     * 在 jvm 上可以将伴生对象的成员真正的生成为静态方法和静态成员，这是通过 @JvmStatic 注解来实现的
     * 伴生对象在编译后会生成静态内部类。
     */
     companion object MyObject{

         var a:Int = 100
        @JvmStatic
         fun method () {
             println("method invoke")
         }

        fun method2 () {
            println("not static method.")
        }
     }
    // 一个类只能有一个伴生对像。。
//    companion object MyObject2 {
//
//    }
}